Skip to content
标签
拦截器
字数
164 字
阅读时间
1 分钟

一、过滤器添加特定地址拦截

java

import com.commnetsoft.commons.utils.StringUtils;
import com.commnetsoft.commons.utils.UriUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * WS过滤器<br/>
 * 该过滤器只支持Websocket请求,其他的请求统统拒绝
 *
 * @author Brack.zhu
 * @date 2020/6/16
 */
@Component
public class WsFilter implements GlobalFilter, Ordered, IBaseFilter {

    /**
     * WS URL接口后缀 .ws
     */
    public static final String WEBSOCKET_URL_SUFFIX = "ws";

    private Logger log = LoggerFactory.getLogger(WsFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String uri = request.getPath().value();
        String ext = UriUtil.getFileExtension(uri);
        if (StringUtils.isNotBlank(ext) && WEBSOCKET_URL_SUFFIX.equals(ext)) {
            String ip = getRequestIp(request);
            log.info("放行ws地址:{},ip:{}", uri, ip);
            return chain.filter(exchange);
        }
        //禁止所有非WS请求
        return requestInvalid(exchange, HttpStatus.FORBIDDEN);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}